import { dictDataApi } from '@/api/dict'

/**
 * 字典工具类
 */
class DictUtil {
  constructor() {
    this.cache = new Map()
    this.loading = new Map()
  }

  /**
   * 根据字典类型获取字典数据
   * @param {string} dictType 字典类型
   * @param {boolean} useCache 是否使用缓存，默认true
   * @returns {Promise<Array>}
   */
  async getDictData(dictType, useCache = true) {
    // 如果使用缓存且缓存中有数据，直接返回
    if (useCache && this.cache.has(dictType)) {
      return this.cache.get(dictType)
    }

    // 如果正在加载，等待加载完成
    if (this.loading.has(dictType)) {
      return this.loading.get(dictType)
    }

    // 开始加载
    const loadingPromise = dictDataApi.getByType(dictType)
      .then(res => {
        const data = res.data || []
        this.cache.set(dictType, data)
        this.loading.delete(dictType)
        return data
      })
      .catch(error => {
        this.loading.delete(dictType)
        throw error
      })

    this.loading.set(dictType, loadingPromise)
    return loadingPromise
  }

  /**
   * 根据字典类型和值获取标签
   * @param {string} dictType 字典类型
   * @param {string} value 字典值
   * @returns {Promise<string>}
   */
  async getLabel(dictType, value) {
    const dictData = await this.getDictData(dictType)
    const item = dictData.find(d => d.dictValue === String(value))
    return item ? item.dictLabel : value
  }

  /**
   * 根据字典类型和值获取样式类
   * @param {string} dictType 字典类型
   * @param {string} value 字典值
   * @returns {Promise<string>}
   */
  async getClass(dictType, value) {
    const dictData = await this.getDictData(dictType)
    const item = dictData.find(d => d.dictValue === String(value))
    return item ? item.listClass : ''
  }

  /**
   * 清除指定字典类型的缓存
   * @param {string} dictType 字典类型
   */
  clearCache(dictType) {
    if (dictType) {
      this.cache.delete(dictType)
    } else {
      this.cache.clear()
    }
  }

  /**
   * 预加载字典数据
   * @param {Array<string>} dictTypes 字典类型数组
   */
  async preload(dictTypes) {
    const promises = dictTypes.map(type => this.getDictData(type))
    return Promise.all(promises)
  }
}

// 导出单例
export const dictUtil = new DictUtil()

/**
 * 字典数据转换过滤器（用于模板中）
 * @param {string} value 字典值
 * @param {string} dictType 字典类型
 * @returns {string}
 */
export function dictLabel(value, dictType) {
  const cache = dictUtil.cache.get(dictType) || []
  const item = cache.find(d => d.dictValue === String(value))
  return item ? item.dictLabel : value
}

/**
 * 字典数据选项（用于select等组件）
 * @param {string} dictType 字典类型
 * @returns {Array}
 */
export function dictOptions(dictType) {
  return dictUtil.cache.get(dictType) || []
}